#!/usr/bin/env node

const inquirer = require('inquirer')
const path = require('path');
const fs = require('fs')
const ejs = require('ejs');

/**
 * @param filesList 输出的模板文件列表
 */
let filesList = []
const templateDir = path.join(__dirname, 'temp')    // 当前目录路径
const distDir = process.cwd()   // 执行目录路径

inquirer.prompt([
    {
        type: 'input',
        name: 'name',
        message: 'Project name is?'
    },
    // {
    //     type: 'input',
    //     name: 'age',
    //     message: 'Project age is?'
    // }
])
    .then((anwsers) => {

        // 创建项目文件
        fs.mkdirSync(path.join(distDir, anwsers.name))

        // 读取并复写模板
        readFileList(templateDir, filesList, undefined, anwsers)

        console.log(
        `
        项目 ${anwsers.name} 已创建
        yarn 下载依赖 
        yarn start:dev 启动项目
        `
        )

    })


/**
 * 
 * @param {String} dir      模板文件路径
 * @param {Array} filesList     输出的模板文件列表
 * @param {String} parentFile      父级文件名称
 * @returns {Array} filesList      输出的模板文件列表
 */
const readFileList = (dir, filesList = [], parentFile, anwsers) => {

    try {
        // 读取生成模板文件目录列表
        files = fs.readdirSync(dir)


        // 遍历模板文件
        files.forEach((file) => {
            let fullPath = path.join(dir, file)     // 模板文件地址
            let relativePath = file     // 初始化绝对路劲层级

            // 如果有父级文件绝对路劲，则拼凑路劲
            if (parentFile) {
                relativePath = path.join(parentFile, file)


            }

            // 读取模板文件
            const stat = fs.statSync(fullPath)

            // 判断是否为文件夹
            if (stat.isDirectory()) {

                // 输入目录路径
                let distDirFile = path.join(distDir, anwsers.name, relativePath)

                // 判断输出目录文件夹是否存在
                if (!fs.existsSync(distDirFile)) {
                    fs.mkdirSync(distDirFile)
                }

                readFileList(fullPath, filesList, relativePath, anwsers) // 递归读取文件
            }
            else {
                filesList.push(relativePath);

                // 使用 ejs 模板引擎读取文件内容，并写入到输出目录
                ejs.renderFile(path.join(templateDir, relativePath), anwsers, (err, result) => {
                    if (err) {
                        throw err
                    }
                    fs.writeFileSync(path.join(distDir, anwsers.name, relativePath), result)
                })
            }
        })


        return filesList

    }
    catch (error) {
        if (anwsers) {
            let dir = path.join(distDir, anwsers.name)

            // 报错后删除文件夹
            removedir(dir)
        }
        throw error
    }

}

/**
 * 
 * @param {String} dir 执行目录路径
 */
const removedir = (dir) => {
    // 读取生成输出目录列表
    files = fs.readdirSync(dir)
    let filesNumber = files.length || 0

    // 遍历删除输出目录及文件
    files.forEach((file) => {
        let fullPath = path.join(dir, file)
        const stat = fs.statSync(fullPath)
        if (stat.isDirectory()) {
            removedir(fullPath)     // 递归删除目录
        }
        else {
            fs.unlinkSync(fullPath)
        }

        filesNumber = --filesNumber     // 计数删除的文件个数
    })

    fs.rmdirSync(dir)

}
